package com.example.shangguigu.bytebit;

import java.nio.charset.Charset;
import java.util.Locale;
import java.util.Set;
import java.util.SortedMap;

/**
 * @DESCRIPTION:
 * @USER: shg
 * @DATE: 2023/2/22 18:16
 */
public class ByteBit {

    public static void main(String[] args) {
        bytesDemo();
        System.out.println("------");
        bitDemo();
        System.out.println("------");
        chineseToByte();
        System.out.println("------");
        chineseToByte_GBK();


        System.out.println("------");
        // test1();
    }

    // 总结：【中文情况下，编码格式不同，一个汉字占用的字节不同;UTF-8编码格式下，占用3个字节，GBK编码格式下，占用2个字节】
    /**
     * GBK编码格式：中文对应的byte和bit
     */
    private static void chineseToByte_GBK() {
        String str = "你";
        byte[] bytes = str.getBytes(Charset.forName("GBK"));
        for (byte aByte : bytes) {
            System.out.print("GBK模式下：" + aByte + "   ");
            System.out.println(Integer.toBinaryString(aByte));
        }
    }

    /**
     * UTF-8编码格式：中文对应的byte和bit
     *
     */
    private static void chineseToByte() {
        String str = "你";
        byte[] bytes = str.getBytes();
        for (byte aByte : bytes) {
            System.out.print("UTF-8模式下：" + aByte + "   ");
            System.out.println(Integer.toBinaryString(aByte));
        }
    }

    /**
     * 输出字符串对应的byte，byte对应的bit
     * <p>
     * 总结：【一个英文字符占用一个字节】
     */
    private static void bitDemo() {
        String str = "abc";
        byte[] bytes = str.getBytes();
        for (byte aByte : bytes) {
            System.out.print(aByte+"   ");
            System.out.println(Integer.toBinaryString(aByte));
        }
    }

    /**
     * 输出字符串对应的byte
     */
    private static void bytesDemo() {
        String str = "a";
        // 字符串对应的字节码数组
        System.out.println("平台默认的字符集："+Charset.defaultCharset().displayName());
        byte[] utf8Bytes = str.getBytes(Charset.defaultCharset());
        for (int i = 0; i < utf8Bytes.length; i++) {
            System.out.println(utf8Bytes[i]);
        }
        System.out.println("使用GBK字符集");
        byte[] gbkBytes = str.getBytes(Charset.forName("GBK"));
        for (byte gbkByte : gbkBytes) {
            System.out.println(gbkByte);
        }
    }

    /**
     * 编码格式
     */
    private static void test1() {
        // 获取系统默认的编码格式
        System.out.println(Charset.defaultCharset().displayName(Locale.ENGLISH));
        System.out.println(Charset.defaultCharset().displayName(Locale.CHINA));

        // 遍历输出所有的编码格式
        SortedMap<String, Charset> availableCharsets = Charset.availableCharsets();
        Set<String> keySet = availableCharsets.keySet();
        for (String key : keySet) {
            System.out.println("key=" + key + ",value=" + availableCharsets.get(key));
        }
    }
}
